package ecom.beans;

import ecom.beans.exception.DeviseException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;

@Stateless
public class EuroConvertorBean implements Serializable, EuroConvertorLocal {

    /**
     * @brief Enumération des devises connues et des taux de conversion vers l'euro
     */
    public enum Currency {

        EUR("Euro", 1.0),
        FRF("FRF", 6.55957),
        DEM("DEM", 1.95583),
        BEF("BEF", 40.3399),
        USD("USD", 1.3353);
        private String name;
        private Double toEuro;

        Currency(String name, Double toEuro) {
            this.name = name;
            this.toEuro = toEuro;
        }

        /**
         * @brief Renvoie la devise par défault pour les programmes clients
         * @return
         */
        public static Currency getDefault() {
            return EUR;
        }

        /**
         * @brief Renvoie le nom complet de la devise
         * @return le nom complet de la devise
         */
        public String getName() {
            return name;
        }

        /**
         * @brief Renvoie le taux de conversion vers l'euro pour la devise
         * @return le taux de conversion vers l'euro pour la devise
         */
        public Double getConversionRate() {
            return toEuro;
        }

        /**
         * @brief Renvoie la devise connue (ou exception) pour une chaîne reçue
         * @param s : devise de type String
         * @return : devise de type currency
         * @throws java.lang.Exception : devise inconnue
         */
        public static Currency get(String s) throws DeviseException {
            for (Currency c : Currency.values()) {
                if (s.equals(String.valueOf(c))) {
                    return c;
                }
            }
            throw new DeviseException("Error : " + s + " is an unknown argument");
        }
    };

    /**
     * @brief Convertit un montant en euro vers un montant de devise X
     * @param amount : montant à convertir
     * @param currencySymbol : devise de destination
     * @return le montant converti
     */
    @Override
    public Double convertFromEuro(Double amount, String currentCurrency) throws DeviseException {
        return amount * Currency.get(currentCurrency).getConversionRate();
    }

    /**
     * @brief Convertit un montant d'une devise vers un montant en euro
     * @param amount : montant à convertir
     * @param currencySymbol : devise d'origine
     * @return le montant converti
     */
    @Override
    public Double convertToEuro(Double amount, String currentCurrency) throws DeviseException {
        return amount / Currency.get(currentCurrency).getConversionRate();
    }

    /**
     * @brief Renvoie le nom complet d'une devise
     * @param currencySymbol : symbole devise
     * @return  le nom complet d'une devise
     * @throws java.lang.Exception : devise inconnue
     */
    @Override
    public String getCurrencyRealName(String currencySymbol) throws DeviseException {
        return Currency.get(currencySymbol).getName();
    }

    /**
     * @brief renvoie la liste des devises connues
     * @return la liste des devises connues
     */
    @Override
    public List<String> getCurrencySymbols() {
        List<String> symbols = new ArrayList<String>();
        for (Currency c : Currency.values()) {
            symbols.add(String.valueOf(c));
        }
        return symbols;
    }
}
